package org.lib.postgresqlhello.user;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Param;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

// 不使用时，默认是主库 lib1
//@DS("lib2")
public interface UserMapper extends BaseMapper<User> {

	/**
	 * 添加用户
	 * @author ben
	 * @date 2021-11-15 20:52:08 CST
	 * @param u 执行成功后，其id会变为 数据表id
	 * @return 成功添加数量
	 */
	Long addUser(User u);
	
	/**
	 * 2参数查询：name模糊查询、email精确查询，都满足才可
	 * @author ben
	 * @date 2021-11-15 20:54:45 CST
	 * @param name 可以为null：不执行查询
	 * @param email 可以为null：不执行查询
	 * @return
	 */
	List<User> searchByTwoParams(String name, String email);
	
	/**
	 * 根据id更新
	 * @author ben
	 * @date 2021-11-15 21:53:29 CST
	 * @param u 字段为null时，不更新，，name为空是也不更新
	 * @return 更新数量
	 */
	Long updateUserById(User u);
	
	/**
	 * 根据 id 或者 name 查询唯一的用户
	 * 使用 choose when 语法
	 * @author ben
	 * @date 2021-11-16 20:37:11 CST
	 * @param u
	 * @return
	 */
	User selectByIdOrName(User u);
	
	/**
	 * 使用 where 标签实现2参数查询
	 * @author ben
	 * @date 2021-11-17 20:43:25 CST
	 * @param u
	 * @return
	 */
	List<User> selectUserUsingWhere(User u);
	
	/**
	 * 使用 trim 替代 where
	 * @author ben
	 * @date 2021-11-17 21:13:13 CST
	 * @param u
	 * @return
	 */
	List<User> selectUserUsingTrim(User u);
	
	/**
	 * 使用 set 标签更新
	 * @author ben
	 * @date 2021-11-17 20:54:31 CST
	 * @param u
	 * @return
	 */
	Long updateByIdSelective(User u);

	/**
	 * 使用 trim 替代 set
	 * @author ben
	 * @date 2021-11-17 21:13:39 CST
	 * @param u
	 * @return
	 */
	Long updateByIdSelectiveUsingTrim(User u);
	
	/**
	 * foreach 标签在 in集合中使用
	 * @author ben
	 * @date 2021-11-17 22:03:47 CST
	 * @param ids
	 * @return
	 */
	List<User> selectUserByIdList(List<Long> ids);
	
	/**
	 * 使用foreach标签实现 批量添加数据
	 * @author ben
	 * @date 2021-11-17 22:17:58 CST
	 * @param users
	 * @return
	 */
	Long addUserMulti(@Param(value = "users") List<User> users);
	
	/**
	 * 使用Map类型更新 foreach标签
	 * @author ben
	 * @date 2021-11-18 20:16:22 CST
	 * @param map
	 * @return
	 */
	Integer updateByMap(Map<String, Object> map);
	
}
